package day_2022_1_to_2.leetcode;

// 1、给定一个数组，将数组中的元素向右移动 k 个位置，其中 k 是非负数。 OJ链接【LeetCode题号: 189. 旋转数组】
// 示例 1: 输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4]
// 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5]
// 向右轮转 3 步: [5,6,7,1,2,3,4]

// 示例2： 输入：nums = [-1,-100,3,99], k = 2 输出：[3,99,-1,-100]
// 解释: 向右轮转 1 步: [99,-1,-100,3] 向右轮转 2 步: [3,99,-1,-100]

public class Num189 {
    public static void main(String[] args) {
        int[] nums=new int[]{1,2,3,4,5,6,7};
        int k=3;
        rotate(nums,k);
    }
    public static void rotate(int[] nums, int k) {
        for (int i = 0; i < k; i++) {
            int temp=nums[nums.length-1];
            for (int j = nums.length-1; j >= 1; j--) {
                nums[j]=nums[j-1];
            }
            nums[0]=temp;
        }
        System.out.print("[");
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i]);
            if(i!= nums.length-1){
                System.out.print(",");
            }
        }
        System.out.println("]");
    }

    /**
     * O(1)方法
     */
//    public void rotate(int[] nums, int k) {
//        if(nums == null || k <= 0 ) {
//            return;
//        }
//        k %= nums.length;
//        reverse(nums, 0, nums.length - 1);
//        reverse(nums, 0, k - 1 );
//        reverse(nums, k, nums.length-1);
//    }
//    public void reverse(int[] nums, int start, int end) {
//        while (start < end) {
//            int temp = nums[start];
//            nums[start] = nums[end];
//            nums[end] = temp;
//            start++;
//            end--;
//        }
//    }

}
